package com.customize;

import com.customize.application.SpringApplication;
import org.apache.catalina.LifecycleException;

import javax.servlet.ServletException;

/**
 * @Author ZhangGJ
 * @Date 2021/05/12 08:21
 */
public class CustomizeSpringBootApplication {

    /**
     * 1.创建SpringApplication.run()初始化tomcat容器：TomcatConfiguration.start()方法启动tomcat
     * 2.MySpringServletContainerInitializer类实现ServletContainerInitializer接口，重写onStartup()方法，
     *      主要参照源码有可能需要初始化多个WebApplicationInitializer，因此进行foreach初始化onStartup(),
     *      并新建META-INF/services/javax.servlet.ServletContainerInitializer，
     *      里面配置MySpringServletContainerInitializer类路径,容器启动时会调用。
     *   ** <注意>：需要在这个自定义的类上加上@HandlesTypes(WebApplicationInitializer.class)注解，
     *      否则容器启动调用onStartup方法，无法注入参数Set<Class<?>> webAppInitializerClasses,
     *      此参数包含了自定义实现的MyWebApplicationInitializer。
     * 3.MyWebApplicationInitializer实现WebApplicationInitializer，重写onStartup()方法
     *   ** <注意>：要对ServletRegistration.Dynamic registration进行非空判断，
     *      因为容器启动会先加载MySpringServletContainerInitializer，然后调用
     *      MyWebApplicationInitializer.onStartup()完成后，会再加载SpringServletContainerInitializer，
     *      会再次调用MyWebApplicationInitializer.onStartup()，
     *      这个时候wrapper.overridable属性会被修改为false，导致servletContext.addServlet("app", servlet)返回null，
     *      因此容器会启动报错SEVERE: A child container failed during start，找不到child container错误。
     * 4.AppConfig类，使用注解@Configuration，@ComponentScan(basePackages = "com.customize")两个注解，
     *      此类无任何方法和变量，主要目的是配置包扫描com.customize下的mvc相关注解，以便容器调用。
     * 5.CustomizeSpringBootApplication类为启动类，调用了SpringApplication.run()方法，
     *      此方法调用了TomcatConfiguration.start()方法启动tomcat容器。
     *   ** <注意>：pom.xml需要增加依赖tomcat-jasper，否则容器启动会报错
     *      java.lang.ClassNotFoundException: org.apache.jasper.servlet.JspServlet
     * @param args
     */
    public static void main(String[] args) throws ServletException, LifecycleException {
        SpringApplication.run(CustomizeSpringBootApplication.class, args);
    }

}
